package com.aaa.tars.service.impl;

import com.aaa.tars.dao.GuidesDao;
import com.aaa.tars.dao.VisitorsDao;
import com.aaa.tars.entity.Guides;
import com.aaa.tars.entity.Visitors;
import com.aaa.tars.entity.guideImages;
import com.aaa.tars.service.GuideImagesService;
import com.aaa.tars.service.GuidesService;
import com.aaa.tars.util.Page;
import com.aaa.tars.util.Result;
import com.aaa.tars.util.ResultUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.*;

/**
 * @FileName: GuidesServiceImpl
 * @Description: 攻略服务实现类
 * @Author: 李宗盛
 * @CreateTime: 2025/9/11 16:35
 * @Version: 17
 */
@Service
public class GuidesServiceImpl implements GuidesService {
    @Resource
    private GuidesDao guidesDao;
    @Resource
    private VisitorsDao visitorsDao;
    @Resource
    private GuideImagesService guideImagesService;
    @Override
    public Guides queryById(Integer guideId) {
        Guides guide = guidesDao.queryById(guideId);
        if (guide != null) {
            // 查询攻略对应的图片
            Page<guideImages> imagePage = new Page<>();
            imagePage.setPageNo(1);
            imagePage.setPageSize(20); // 最多获取20张图片
            guideImages imageData = new guideImages();
            imageData.setGuideId(guideId);
            imagePage.setData(imageData);

            PageInfo imagePageInfo = guideImagesService.queryByPage(imagePage);
            if (imagePageInfo != null && imagePageInfo.getList() != null) {
                guide.setImages(imagePageInfo.getList());
            }

            // 设置作者名称
            Visitors visitor = visitorsDao.queryById(guide.getVisitorId());
            if (visitor != null) {
                guide.setVisitorsName(visitor.getVisitorsName());
            }
        }
        return guide;
    }
    @Override
    public PageInfo queryByPage(Page<Guides> page) {
        Integer pageNo = page.getPageNo();
        Integer pageSize = page.getPageSize();
        if (pageNo == null || pageNo == 0 || pageSize == null || pageSize == 0) {
            throw new IllegalArgumentException("非法参数异常");
        }
        PageHelper.startPage(pageNo, pageSize);
        Guides data = page.getData();

        // 查询攻略列表并关联游客信息
        List<Guides> guidesList = guidesDao.queryAll(data);

        // 为每个攻略设置游客用户名
        for (Guides guide : guidesList) {
            Visitors visitor = visitorsDao.queryById(guide.getVisitorId());
            if (visitor != null) {
                guide.setVisitorsName(visitor.getVisitorsName()); // 需要先在Guides实体类中添加visitorName字段
            }
        }

        return new PageInfo(guidesList);
    }

    @Override
    public int add(Guides guides) {
        // 设置创建时间和更新时间
        Date now = new Date();
        guides.setCreateTime(now);
        guides.setUpdateTime(now);

        int result = guidesDao.add(guides);

        // 确保获取到主键ID（需要在Mapper中配置useGeneratedKeys）
        if (result > 0 && guides.getGuideId() == null) {
            // 如果MyBatis没有返回主键，可能需要重新查询最新插入的ID
            // 这里需要根据你的具体实现来调整
        }

        return result;
    }

    @Override
    public int update(Guides guides) {
        // 设置更新时间
        guides.setUpdateTime(new Date());
        return guidesDao.update(guides);
    }

    @Override
    public int deleteById(Integer guideId) {
        return guidesDao.deleteById(guideId);
    }
    /**
     * 上传景区图片
     * @param file 上传的文件
     * @return 上传结果和文件路径
     */
    @Override
    public Result uploadImage(MultipartFile file) {
        if (file.isEmpty()) {
            return ResultUtil.error("上传文件为空");
        }

        // 检查文件类型
        String contentType = file.getContentType();
        if (!"image/jpeg".equals(contentType) && !"image/png".equals(contentType)) {
            return ResultUtil.error("只允许上传JPG/PNG格式的图片");
        }

        // 检查文件大小（最大10MB）
        long size = file.getSize();
        if (size > 10 * 1024 * 1024) {
            return ResultUtil.error("图片大小不能超过10MB");
        }

        try {
            // 获取项目根目录下的resources/static/img/scenic目录 (源代码目录)
            String srcPath = System.getProperty("user.dir") + "/src/main/resources/static/img/scenicPic/";
            File srcDir = new File(srcPath);
            if (!srcDir.exists()) {
                srcDir.mkdirs();
            }

            // 获取target/classes/static/img/scenic目录 (编译后目录)
            String targetPath = System.getProperty("user.dir") + "/target/classes/static/img/scenicPic/";
            File targetDir = new File(targetPath);
            if (!targetDir.exists()) {
                targetDir.mkdirs();
            }

            // 生成唯一文件名
            String originalFilename = file.getOriginalFilename();
            String fileExtension = originalFilename != null ?
                    originalFilename.substring(originalFilename.lastIndexOf(".")) : ".jpg";
            String newFilename = UUID.randomUUID().toString().replace("-", "") + fileExtension;

            // 保存文件到源代码目录
            String srcFilePath = srcPath + newFilename;
            file.transferTo(new File(srcFilePath));

            // 复制文件到target目录
            Files.copy(
                    new File(srcFilePath).toPath(),
                    new File(targetPath + newFilename).toPath(),
                    StandardCopyOption.REPLACE_EXISTING
            );

            // 返回可访问的URL路径
            String urlPath = "/img/scenicPic/" + newFilename;
            Map<String, String> data = new HashMap<>();
            data.put("url", urlPath);

            return ResultUtil.success(data);
        } catch (IOException e) {
            e.printStackTrace();
            return ResultUtil.error("文件上传失败: " + e.getMessage());
        }
    }
}